
/**
 * token认证中间件处理
 * 过程：
 *   登陆成功后，再次请求header中会携带有token字段，
 *   根据该token解密后得到数据判断是否token有误
 *   有误则直接跳转错误提示，否则到redis中获取token判断
 * 是否已经退出登录，如一退出则跳转错误提示，否则继续执行判断是否活跃期内，
 * 通过则进入路由控制器中执行对应逻辑，否则跳转错误提示
 */
export default function auth() {
  return async (ctx, next) => {
    await next();  
    // 后续中间件执行完成后将响应体转换成 gzip
    let authorization=ctx.header?ctx.header['authorization'] :'';
    if(!authorization){
        return ctx.body={message:'未登录',code:0}
    }
    if(authorization && authorization.indexOf('Bearer ')>-1){
      authorization=authorization.split("Bearer ")[1];
    }
    console.log(authorization);
    let vertify =await ctx.service.token.decode_jwt(authorization);
    if(!vertify || JSON.stringify(vertify)==='{}'||Object.keys(vertify).length<=0){
      return ctx.body={message:'没有登录令牌,或登录令牌有误',code:0}
    }
    let key_id=Object.keys(vertify).filter(e=>{return e.indexOf('_id')>-1})[0];
    if(!key_id){
      return ctx.body={message:'登录令牌有误',code:0}
    }
    let token=await ctx.app.redis.hget("token",vertify[key_id]);
    if(!token){
      return ctx.body={message:'该账号已经退出，请重新登录',code:0}
    }
    if(vertify[key_id]&&authorization!=token){
      console.log(vertify[key_id]);
      await ctx.app.redis.hset("token",vertify[key_id],authorization);
    }
    let curTime=Number(Date.now())/1000;
    // let expireTime=await ctx.app.redis.hget("token",authorization)
    // if(!expireTime){
      
    // )
    
    if(vertify.exp<=curTime){
      return ctx.body={message:'令牌超时',code:0}
    }
    if(vertify.exp-curTime<=24*3600){//是否在活跃期内
      console.log("活跃期类")
      //await ctx.app.redis.hdel("token",authorization);
      vertify=JSON.parse(JSON.stringify(vertify));
      delete vertify['exp'];
      delete vertify['iat'];
      let new_token=await ctx.service.token.sign_jwt(vertify,key_id);
      ctx.set("token",new_token);
    }
  };
}
